// 数据结构-图
#ifndef GRAPH_H
#define GRAPH_H

// 最大顶点数
#ifndef MAX_VEX
#define MAX_VEX 100
#endif

// 表示不连通
#define INFINITE 65535

/// @brief 图的邻接矩阵结构，这里的图是有向图，且带权值
typedef struct
{
	char vertexs[MAX_VEX];		 // 顶点表
	int edges[MAX_VEX][MAX_VEX]; // 邻接矩阵
	int vertexNum, edgeNum;		 // 顶点数和边数
} MGraph, *Graph;

/// @brief 初始化一个图对象
/// @return 图对象指针
Graph createGraph();

/// @brief 查找图中的一个点的位置
/// @param graph 传入图的指针
/// @param v 查找顶点v在顶点表的下标
/// @return v的下标，点不存在返回-1
int locateVex(Graph, char);

/// @brief 查找图中顶点v的第一个邻接点
/// @param  graph 传入图的指针
/// @param v 顶点v的下标
/// @return 顶点v的邻接点的下标，没有邻接点返回-1
int firstAdjVex(Graph, int);

/// @brief 查找v相对于w的下一个邻接点
/// @param graph 传入图的指针
/// @param v v的下标
/// @param w w的下标
/// @return 返回v相对于w的下一个邻接点的下标，若w为v的最后一个邻接点则返回-1
int nextAdjVex(Graph, int, int);

/// @brief 插入一个顶点
/// @param graph 传入图的指针
/// @param v 插入顶点的值
void insertVex(Graph, char);

/// @brief 插入多个顶点
/// @param graph 传入图的指针
/// @param vexs 顶点数组
void insertVexs(Graph, char[]);

/// @brief 插入或者修改一条弧
/// @param graph 传入图的指针
/// @param v 弧的起点下标
/// @param w 弧的终点下标
/// @param weight 弧的权值
void insertArc(Graph, int, int, int);

/// @brief 插入或者修改多个弧
/// @param graph 传入图的指针
/// @param start 起点下标数组
/// @param end 终点下标数组
/// @param weights 权值下标数组
/// @param n 弧的个数
/// @param undirect 是否双向添加
void insertArcs(Graph, int[], int[], int[], int, int);

/// @brief 深度优先遍历并输出-递归部分
/// @param graph 传入图的指针
/// @param start 遍历起始点
/// @param visit 辅助数组记录已访问的点
void DFS(Graph, int, int[]);

/// @brief 深度优先遍历
/// @param graph 传入图的指针
void DFSTraverse(Graph);

/// @brief 广度优先遍历
/// @param graph 传入图的指针
void BFSTraverse(Graph);

/// @brief 打印图
/// @param graph 传入图的指针
void printGraph(Graph);

#include "graph.c"

#endif